蓝桥杯嵌入式 | 您所在的位置:网站首页 › 1492 20题20 › 蓝桥杯嵌入式 |
前言
最近在做题的时候遇到了一个问题,就是单片机与上位机之间的通信出现问题。例如我发送这样一个数组Data:{1,2,3,4},即使用: HAL_UART_Transmit(&huart1,Data,4,500);但是上位机并没有收到1,2,3,4这四个数字,而是收到了乱码。同理我使用上位机软件给下位机发送数据时,例如发送:1234,单片机中使用: HAL_UART_Recieve_IT(&huart1,R_Data,4);进行接收,我们可以发现收到的数据并不是我们预想当中的1,2,3,4;这究竟是什么原因呢? 原因造成这样的结果在于上位机给我们发送的是ASCII码,并且上位机接收显示的也是ASCII码,而不是数值大小。 总所周知,ASCII码是由八位二进制小数进行一映射的,从0-127的数字分别对应了不同字符: ![]() 也就是说,我们给上位机发 “1”,上位机实际接收到的是0000_0001(B),对应ASCII为SOH(SOH(start of headline) 标题开始),因此上位机并不显示1,而是显示SOH,要想上位机显示1,应该给它发送49(u8)才对。 同理,上位机发送“1“,我们实际接收到的为49(u8),因此应该减去48才为我们需要得到的数字1。 在单片机中,我们的数字一律是实际的数值,我们定义变量时,定义为u8,u6,就是代表无符号的整数,单片机串口发送也是发送这些数值。 而在上位机中,则是发ASCII码,显示ASCII码。 解决办法即所有发送的数字数据都+48,接收的数据都-48即可。对于字母来说,单片机和上位机都是使用ASCII码表征,因此不需要切换。 值得注意的是,使用单引号这个技巧: ‘A’,‘1’,‘2’我们如果把发送的数据改成: uint8_t Data[10]={'1','2','3','4'};那么这样上位机就可以完美接收到1234。 单引号代表取这个符号的ASCII值,因此比较字符串,可以使用Data[x]=='A',这样的操作进行比较。 |
CopyRight 2018-2019 实验室设备网 版权所有 |